class Solution {
public:
  //双指针法：
  /*** 可以使用双指针：右指针 right 指向当前将要处理的元素，左指针 left 指向下一个将要赋值的位置。
        如果右指针指向的元素不等于 val，它一定是输出数组的一个元素，我们就将右指针指向的元素复制到左指针位置，然后将左右指针同时右移；
        如果右指针指向的元素等于 val，它不能在输出数组里，此时左指针不动，右指针右移一位。
    整个过程保持不变的性质是：区间 [0,left) 中的元素都不等于val。当左右指针遍历完输入数组以后，left 的值就是输出数组的长度。
  ***/
/*
    int removeElement(vector<int>& nums, int val) {
        int left = 0;
        for(int right = 0; left <= right && right < nums.size(); ++right){
            // 如果== val满足删除条件，back一直向后直到遇到不需要删除的元素或结束；
            if(nums[right] != val)
            // 覆盖满足删除val的元素
                nums[left++] = nums[right];
        }
        return left;
    }
*/


    // 返回逆序的双指针，少了不必要的重复覆盖
    int removeElement(vector<int>& nums, int val) {
        int left = 0, right = nums.size();
        while(left < right){
            if(nums[left] == val){
                // 覆盖
                nums[left] = nums[--right];
            }
            else ++left;
        }
        return left;
    }
};